// 引入 Vue
import Vue from 'vue'
// 引入 路由
import VueRouter from 'vue-router'
// 引入路由信息
import routes from './routes';
// 引入 store
import store from '../store';
// 引入获取 localStorage 中 token 方法
import {getToken} from '../utils/token';
// 使用路由插件
Vue.use(VueRouter)

// 重写 push、replace 方法
// push方法是 一个 promise 如果不重写每个push后面都的加 ()=>函数 不然点击两次时会报警报或者错误
// 先将原来原型方法浅拷贝一份
let Push = VueRouter.prototype.push;
let Replace = VueRouter.prototype.replace;

// 重写 push方法
VueRouter.prototype.push = function(location,resolve,reject) {
  if(resolve && reject) {
    // 篡改上下文 直接Push() this指向则是 window call()改变this指向VueRouter
    Push.call(this,location,resolve,reject)
  }else{
    Push.call(this,location,()=>{},()=>{})
  }
}
// 重写 replace 方法
VueRouter.prototype.replace = function(location,resolve,reject) {
  if(resolve && reject) {
    Replace.call(this,location,resolve,reject)
  }else{
    Replace.call(this,location,()=>{},()=>{})
  }
}
let router = new VueRouter({
  routes,
  scrollBehavior(to, from, savedPosition) {
    // 始终滚动到顶部
    return { y: 0 }
  },
})

// 前置路由守卫
router.beforeEach(async (to,from,next) => {
  // to: 跳转的地方
  // from: 来自哪个路由
  let token = getToken('TOKEN')
  let name = store.state.user.userName.name
  // 跳转前 判断是否又 token
  if(token){
    // 重定向 home 路由
    if(to.path === '/login'){
      next('/home')
    }else{
      // 判断是否有用户名 有的话 则路由随意跳
      //  第一次肯定时没有 name 的 因为还没派发 getUserInfo, 所以刚进来会执行 else
      // console.log(store.state.user.userName)
      if(name){
        // console.log('1111',name)
        next()
      }else{
        try {
          // 当没有用户名时 派发 actions 获取用户名
          await store.dispatch('user/getUserInfo')
          next()
          // console.log('222')
        } catch (error) {
          // 只有当token过期的时候 才会执行这条语句
          await store.dispatch('user/loginOut')
          // 当 token 失效时 自动跳转登录页面 （很多网站都是这样 比如执教云 登录进去后 几分钟没操作token失效，用户回到登录界面）
          router.push('/login')
          alert('token已过期,请重新登录',error.message)
        }
      }
    }
  }else{
    let toPath = to.path
    // 未登录时 以下路径是不能去的
    if(toPath.includes('/pay') || toPath.includes('trade') || toPath.includes('/center')){
      // 利用 query 带入用户登录之前想去的路径（比如用点击我的订单 但是没有登录，当再次登录时 则直接跳到我的订单）
      next(`/login?redirect=${to.path}`)
    }else{
      next()
    }
  }
})

export default router